package 基础;

import java.util.List;
/*
java为其操作维护一组系统属性。每个java系统属性都是键值（String-String）对，例如“ java.version”=“1.7.0_09 ”。您可以通过检索所有系统属
性，System.getProperties()也可以通过检索单个属性System.getProperty(key)。

请注意，Java安全管理器和策略文件可以限制对系统属性的访问。默认情况下，Java程序可以无限制地访问所有系统属性。

重要的Java系统属性

【JRE相关的系统属性】
java.home	JRE主目录，例如“ C:\Program Files\Java\jdk1.7.0_09\jre”。
java.library.path	用于搜索本机库的JRE库搜索路径。它通常但不一定取自环境变量PATH。
java.class.path	JRE类路径，例如，'.'（点 - 用于当前工作目录）。
java.ext.dirs	JRE扩展库路径，例如“ C:\Program Files\Java\jdk1.7.0_09\jre\lib\ext;C:\Windows\Sun\Java\lib\ext”。
java.version	JDK版本，例如1.7.0_09。
java.runtime.version	JRE版本，例如1.7.0_09-b05。

【文件相关的系统属性】
file.separator	文件目录分隔符的符号，例如'd:\test\test.java'。默认适用'\'于Windows或'/'Unix / Mac。
path.separator	用于分隔路径条目的符号，例如，PATH或CLASSPATH。默认适用';'于Windows或':'Unix / Mac。
line.separator	行尾（或新行）的符号。默认适用"\r\n"于Windows或"\n"Unix / Mac OS X.

【用户相关的系统属性】
user.name	用户的名字。
user.home	用户的主目录。
user.dir	用户的当前工作目录。

【OS相关的系统属性】
os.name	操作系统的名称，例如“ Windows 7”。
os.version	操作系统的版本，例如“ 6.1”。
os.arch	OS的架构，例如“ x86”。

获取系统属性
如前所述，您可以通过System.getProperties()或通过检索单个属性来获取所有系统属性System.getProperty(key)。
*/
import java.util.Map;
import java.util.Properties;
public class 系统属性 {
	public static void main(String[] args) throws Throwable {
		//String str=System.getProperty("sun.boot.library.path");
		System.out.println(System.getProperty("sun.boot.library.path"));
//		URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
//		URL[] urls = sun.boot.library.path.getBootstrapClassPath().getURLs();
//		for (int i = 0; i < urls.length; i++) {
//			System.out.println(urls[i].toExternalForm());
//		}
		System.out.println( "java版本号："  + System.getProperty( "java.version" ));  // java版本号
	    System.out.println( "Java提供商名称："  + System.getProperty( "java.vendor" ));  // Java提供商名称
	    System.out.println( "Java提供商网站："  + System.getProperty( "java.vendor.url" ));  // Java提供商网站
	    System.out.println( "jre目录："  + System.getProperty( "java.home" ));  // Java，哦，应该是jre目录
	    System.out.println( "Java虚拟机规范版本号："  + System.getProperty( "java.vm.specification.version" ));  // Java虚拟机规范版本号
	    System.out.println( "Java虚拟机规范提供商："  + System.getProperty( "java.vm.specification.vendor" ));  // Java虚拟机规范提供商
	    System.out.println( "Java虚拟机规范名称："  + System.getProperty( "java.vm.specification.name" ));  // Java虚拟机规范名称
	    System.out.println( "Java虚拟机版本号："  + System.getProperty( "java.vm.version" ));  // Java虚拟机版本号
	    System.out.println( "Java虚拟机提供商："  + System.getProperty( "java.vm.vendor" ));  // Java虚拟机提供商
	    System.out.println( "Java虚拟机名称："  + System.getProperty( "java.vm.name" ));  // Java虚拟机名称
	    System.out.println( "Java规范版本号："  + System.getProperty( "java.specification.version" ));  // Java规范版本号
	    System.out.println( "Java规范提供商："  + System.getProperty( "java.specification.vendor" ));  // Java规范提供商
	    System.out.println( "Java规范名称："  + System.getProperty( "java.specification.name" ));  // Java规范名称
	    System.out.println( "Java类版本号："  + System.getProperty( "java.class.version" ));  // Java类版本号
	    System.out.println( "Java类路径："  + System.getProperty( "java.class.path" ));  // Java类路径
	    System.out.println( "Java lib路径："  + System.getProperty( "java.library.path" ));  // Java lib路径
	    System.out.println( "Java输入输出临时路径："  + System.getProperty( "java.io.tmpdir" ));  // Java输入输出临时路径
	    System.out.println( "Java编译器："  + System.getProperty( "java.compiler" ));  // Java编译器
	    System.out.println( "Java执行路径："  + System.getProperty( "java.ext.dirs" ));  // Java执行路径
	    System.out.println( "操作系统名称："  + System.getProperty( "os.name" ));  // 操作系统名称
	    System.out.println( "操作系统的架构："  + System.getProperty( "os.arch" ));  // 操作系统的架构
	    System.out.println( "操作系统版本号："  + System.getProperty( "os.version" ));  // 操作系统版本号
	    System.out.println( "文件分隔符："  + System.getProperty( "file.separator" ));  // 文件分隔符
	    System.out.println( "路径分隔符："  + System.getProperty( "path.separator" ));  // 路径分隔符
	    System.out.println( "直线分隔符："  + System.getProperty( "line.separator" ));  // 行尾分隔符 默认适用"\r\n"于Windows或"\n"Unix / Mac OS X.
	    System.out.println( "操作系统用户名："  + System.getProperty( "user.name" ));  // 用户名
	    System.out.println( "操作系统用户的主目录："  + System.getProperty( "user.home" ));  // 用户的主目录
	    System.out.println( "当前程序所在目录："  + System.getProperty( "user.dir" ));  // 当前程序所在目录
	      
	    //获取所有的属性
	    Properties properties = System.getProperties();
	    //遍历所有的属性
	    System.out.println("遍历所有的属性");
	    int i=1;
	    for (String key : properties.stringPropertyNames()) {
	        //输出对应的键和值
	        System.out.println(i+": "+key + "=" + properties.getProperty(key));
	        i++;
	    }
	    //遍历所有环境变量
	    System.out.println("遍历所有环境变量");
	    int j=0;
//	    System.getenv().forEach((key, value) -> {
//	          System.out.println(j+": "+key + ":" + value);
//	    });
	    Map<String, String> map =System.getenv();
	    for (String key: map.keySet()) {
	    	System.out.println(j+": "+key + ": " + map.get(key));
	    	j++;
	    }
	    
	
	}
}
/*
【设置系统属性】
在java中，您可以从命令工具或Java代码本身设置自定义系统属性。

1.从命令行设置系统属性（“-D”选项）
   java -Dcustom_key="custom_value" application_launcher_class

2.使用System.setProperty（）方法从代码设置系统属性
    System.setProperty("custom_key", "custom_value");
    设置指定键对值的系统属性
  
  setProperty (String prop, String value);
  
  参数：
  prop - 系统属性的名称。
  value - 系统属性的值。  
  
  返回：
  系统属性以前的值，如果没有以前的值，则返回 null。
  
  抛出：  
  SecurityException - 如果安全管理器存在并且其 checkPermission 方法不允许设置指定属性。
  NullPointerException - 如果 key 或 value 为 null。
  IllegalArgumentException - 如果 key 为空。
  注：这里的system，系统指的是 JRE (runtime)system，不是指 OS。
*/